package com.datastructure.test.reverseorder;

public class ReverseOrder {

    public static void main(String[] args) {
        ReverseOrder reverseOrder = new ReverseOrder();
        int [] array = {1,2,3,4,5,6,7,0};
        System.out.println(reverseOrder.InversePairs(array));
    }

    int cnt=0;
    public int InversePairs(int [] array) {
        if(array.length != 0){
            divide(array,0,array.length-1);
        }
        return cnt;
    }
    public void divide(int[] array,int start,int end){
        //递归终止条件
        if(start >= end)   return;
        //取中
        int mid=start+(end-start)/2;
        //分
        divide(array,start,mid);
        divide(array,mid+1,end);
        //治
        merge(array,start,mid,end);
    }
    public void merge(int[] array,int start,int mid,int end){
        //临时数组
        int[] tmp=new int[end-start+1];
        //i和j表示两个分数组的左下标，k表示临时数组的当前下标
        int i=start,j=mid+1,k=0;
        while(i<=mid && j<= end){
            //如果前小于后，则存前，前右移
            if(array[i]<=array[j]){
                tmp[k++]=array[i++];
            }
            //如果前大于后，则存后，后右移-------***此时存在逆序对，要进行比较
            else{
                tmp[k++]=array[j++];
                //如果此时前大于后，那么现有前到最后的元素都会大于后
                cnt=(cnt+mid-i+1)%1000000007;
            }
        }
        //未遍历完的直接放在右侧
        while(i<=mid){
            tmp[k++]=array[i++];
        }
        while(j<=end){
            tmp[k++]=array[j++];
        }
        //将临时数组的值覆盖原来数组
        for( k=0;k<tmp.length;k++){
            array[start+k]=tmp[k];
        }
    }
}
